Source code -> compiler -> Assembler -> Object code -> Linker -> Executable file -> Loader
链接器是将多个obj模块链接成为一个obj文件的程序,说白了就是一个缝合器,将程序进行缝合,本文将对基本的linker script进行介绍。
基本概念
链接器
将一个或多个输入文件链接成为一个输出文件(不一定是可执行文件,也有可能是缝合成一个更大的库)
文件
输入文件:待链接的目标文件或链接脚本文件,输入文件内的section为输入section
输出文件:目标文件或可执行文件(目标文件在linux下一般为ELF格式),输出文件内的section为输出section
section
section类型
对程序划分的段,输入文件内的section叫输入section,输出文件为输出section,一个section至少包含名字和大小,大部分还包含与其关联的一块数据,成为section content。一个section可被标记为可加载的(loadable)或可分配的(allocatable),如果一个section不可加载或分配,那么一般包含调试信息(可使用objdump查看)。
- loadable section:输出文件运行时,对应的内容被加载到进程地址空间
- allocatable section:内容为空的section可被标记为可分配的,在输出文件运行时,会预先分配section指定大小的内存(某些情况下该内存强制为0)
section地址
每个可加载或分配的section一般包含两个地址:VMA和LMA,一般情况下两者相同
- VMA:虚拟内存地址或程序地址空间地址(运行地址)
- LMA:加载内存地址或进程地址空间地址(加载地址)
Linux下链接器使用
一个script范例及讲解
源码
1 | /* Simple linker script for the JOS kernel. |
名词解释
Location counter .
.
是链接器中的location counter,表示目前所在的location,SECTIONS开始时默认为0,可以人为调整其位置。同时,location counter会随着输出section的增加自动增加。